/*
 * Vec.h
 *
 *  Created on: 05.06.2012
 *      Author: schaf
 */

#ifndef VEC_H_
#define VEC_H_

#include <iostream>

class Vec {
private:
	double x_;
	double y_;
	double z_;

public:
	Vec();
	Vec(double);
	Vec(double, double, double);
	Vec(const Vec&);

	virtual ~Vec();

	void setX(double);
	void setY(double);
	void setZ(double);
	void setXYZ(double, double, double);

	double getX() const;
	double getY() const;
	double getZ() const;

	double dotProduct(const Vec&) const;
	Vec crossProduct(const Vec&) const;
	Vec scalarMultiply(double) const;
	double absoluteValue() const;
	double abs() const;
	double distanceTo(const Vec&) const;
	
	Vec& operator=(const Vec&);

	Vec& operator=(double);
	Vec& operator=(int);
	Vec& operator=(long);

#ifdef CXX0X
	Vec& operator=(double[]);
	Vec& operator=(int[]);
	Vec& operator=(long[]);
#endif /* CXX0X */
	
	Vec& operator+=(const Vec&);
	Vec& operator-=(const Vec&);
	Vec& operator*=(double);
	Vec& operator/=(double);
	
	double operator[](int) const;
	double operator[](char) const;
};

Vec operator+(const Vec&, const Vec&);
Vec operator+(const Vec&);
Vec operator-(const Vec&, const Vec&);
Vec operator-(const Vec&);

double operator*(const Vec&, const Vec&);
Vec operator*(const Vec&, double);
Vec operator*(double, const Vec&);

Vec operator/(const Vec&, double);

bool operator==(const Vec&, const Vec&);
bool operator==(const Vec&, double);
bool operator==(double, const Vec&);

bool operator!=(const Vec&, const Vec&);
bool operator!=(const Vec&, double);
bool operator!=(double, const Vec&);

std::ostream& operator<<(std::ostream&, const Vec&);

#endif /* VEC_H_ */
